package cz.vse.adventura.po1715.xburj54_bursa.hra;

import cz.vse.adventura.po1715.xburj54_bursa.hra.Kapsa;
import cz.vse.adventura.po1715.xburj54_bursa.hra.APříkaz;
import cz.vse.adventura.po1715.xburj54_bursa.hra.HraLupič;

/*******************************************************************************
 * Instance třídy {@code PrikazPoužij} představuje příkaz
 * k použití předmětu na jiný předmět.
 * Aby byl příkaz proveden, musí být zadány oba předměty, s kterýmy se bude manipulovat.
 *
 * @author Jan Bursa
 * @version 1.02,  16.12.2010
 */
public class PříkazPoužij extends APříkaz
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Atributy určující že operace zatím nebyla provedena*/
    static boolean POUŽITO = false;
    static boolean DRAT_USTIPNUT = false;
    static boolean DVERE_ODEMCENY = false;
    static boolean UMYVADLO_ODSROUBOVANO = false;
    static boolean KAMINEK_VYNDAN = false;
    static boolean KLICEK_VLOZEN = false;
    static boolean KAMINEK_VLOZEN = false;
    static boolean KLIKA_VYROBENA = false;

//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří instanci mající na starosti reakci na příkaz <b>použij</b>,
     * po jehož zadaní hráč použije předmět, který bude zadán v prvním parametru,
     * na předmět uvedený v druhém parametru. Parametry jsou uváděny za příkazem.
     */
    public PříkazPoužij()
    {
        super( "Použij",
               "Použije předmět zadaný v prvním parametru na předmět zadaným v druhém parametru." );
    }

//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Příkaz vyjme první zadaný předmět z kapes a použije ho na druhý
     * zadaný předmět; před tím však nejprve zkontroluje,
     * zda byly zadány oba předměty, zda se předmět, který se má
     * použít, má hráč aktuálně v batohu a zda předmět, na který se bude první předmět používat,
     * je v aktuální místnosti.
     *
     * @param parametry Název předmětu, který se má použít,
     *                  následovaný názvem předmětu na který se bude používat
     * @return Text zpravy vypsane po porovedeni prikazu
     */
    @Override
    public String execute( String... parametry )
    {   POUŽITO = false;
        if (parametry.length != 2) {
            return "Příkaz potřebuje dva parametry:\n" +
                   "předmět, který se má použít\n" +
                   "a předmět, na který se bude první předmět používat ";
        }
        String předmětvruce = parametry[0];
        String předmětvprostoru  = parametry[1];
        Kapsa kap = (Kapsa) HraLupič.getHra().getBag();
        Místnost am = Místnost.getAktuálníMístnost();
        Předmět predmet2mistnost = (Předmět)Kapsa.najdi(předmětvprostoru,
                          am.getObjects());
        if (predmet2mistnost == null)  {
            return "Předmět " + předmětvprostoru + " není v aktuální místnosti";
        }
        if (! kap.obsahuje(předmětvruce)) {
            return "Můžete použít pouze předmět, který máte v držení.";
        }                                                       //==========>
        String odpoved = "";
        if (predmet2mistnost != null) {
            odpoved = "\nRozhodl(a) jste se použít předmět " + předmětvruce + " na předmět " + předmětvprostoru + ".";
        }
        /*Plot - Kleště*/
        if ((předmětvprostoru.equalsIgnoreCase("Plot"))&&
            (předmětvruce.equalsIgnoreCase("Kleště"))&&
            (DRAT_USTIPNUT))
        {
            return "Další drát už není potřeba";
        }
        if ((předmětvprostoru.equalsIgnoreCase("Plot"))&&
            (předmětvruce.equalsIgnoreCase("Kleště")))
        {
            POUŽITO = true;
            DRAT_USTIPNUT = true;
            am.poloz(Předmět.DRÁT);  //přidat do předmětů drát
            return odpoved + "\nUštípl(a) jste z plotu kus drátu";
        }
        /*Klíč - Dveře*/
        if ((předmětvprostoru.equalsIgnoreCase("Dveře"))&&
            (předmětvruce.equalsIgnoreCase("Klíč"))&&
            (DVERE_ODEMCENY))
        {
            return "Dveře jsou již odemčeny.";
        }
        if ((předmětvprostoru.equalsIgnoreCase("Dveře"))&&
            (předmětvruce.equalsIgnoreCase("Klíč")))
        {
            POUŽITO = true;
            DVERE_ODEMCENY = true;
            kap.vyjmi(předmětvruce); //odebere Klíč z batohu
            am.pridejsoused(Místnost.Předsíň);  //přidat do sousedů předsín
            am.poloz( Předmět.KLÍČ ); // nechá klíč v místnosti
            return odpoved + "\nOdemkl(a) jste dveře do předsíně.";
        }
        /*Šroubovák - Umyvadlo*/
        if (((předmětvprostoru.equalsIgnoreCase("Umyvadlo"))&&
            (předmětvruce.equalsIgnoreCase("Šroubovák"))&&
            (UMYVADLO_ODSROUBOVANO)))
        {
            return "Kryt odpadu je již vyšroubován.";
        }
        if ((předmětvprostoru.equalsIgnoreCase("Umyvadlo"))&&
            (předmětvruce.equalsIgnoreCase("Šroubovák")))
        {
            POUŽITO = true;
            UMYVADLO_ODSROUBOVANO = true;
            am.poloz(Předmět.KAMÍNEK);  //přidat do předmětů kamínek
            return odpoved + "\nOdšrouboval(a) jste kryt odpadu umyvadla";
        }
        /*Lžička - Kamínek*/
        if (((předmětvprostoru.equalsIgnoreCase("Kamínek"))&&
            (předmětvruce.equalsIgnoreCase("Lžička"))&&
            (KAMINEK_VYNDAN)))
        {
            return "Kamínek již v umyvadle není.";
        }
        if (((předmětvprostoru.equalsIgnoreCase("Kamínek"))&&
            (předmětvruce.equalsIgnoreCase("Lžička"))&&
            (UMYVADLO_ODSROUBOVANO)))
        {
            POUŽITO = true;
            KAMINEK_VYNDAN = true;
            am.odeber(Předmět.KAMÍNEK);
            am.poloz(Předmět.KAMÍNEK2);
            return odpoved + "\nVydloubl(a) jste kamínek z odpadu Umyvadla.";
        }
        /*Kamínek - Trezor*/
        if ((předmětvprostoru.equalsIgnoreCase("Trezor"))&&
            (předmětvruce.equalsIgnoreCase("Kamínek")))
        {
            POUŽITO = true;
            KAMINEK_VLOZEN = true;
            kap.vyjmi(předmětvruce); //odebere Klíč z batohu
            return odpoved + "\nVložil(a) jste Kamínek do otvoru v trezoru.";
        }
        /*Klíček - Trezor*/
        if ((předmětvprostoru.equalsIgnoreCase("Trezor"))&&
            (předmětvruce.equalsIgnoreCase("Klíček")))
        {
            POUŽITO = true;
            KLICEK_VLOZEN = true;
            kap.vyjmi(předmětvruce); //odebere Klíč z batohu
            return odpoved + "\nVložil(a) jste Klíček do dirky v trezoru.";
        }
        /*Drát - Trezor*/
        if ((předmětvprostoru.equalsIgnoreCase("Trezor"))&&
            (předmětvruce.equalsIgnoreCase("Drát")))
        {
            POUŽITO = true;
            KLIKA_VYROBENA = true;
            kap.vyjmi(předmětvruce); //odebere Klíč z batohu
            return odpoved+ "\nPoužil(a) jste Drát jako kliku k trezoru.";
        }
        return odpoved;                                         //==========>
    }

//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== VNOŘENÉ A VNITŘNÍ TŘÍDY ===================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        PrikazPoužij x = new PrikazPoužij();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
    }
